package ar.com.profertil.utils.service;

import java.util.Random;

import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;

import ar.com.profertil.utils.Zipper;
import ar.com.profertil.utils.entity.EnviarArchivoEntity;

/**
 * The Class EnviarArchivoBancoService.
 */
public class EnviarArchivoBancoService {

	/**
	 * Enviar archivo.
	 * 
	 * @param enviarArchivoEntity
	 *            the enviar archivo entity
	 * @param keyStorageView
	 *            the key storage view
	 * @param sAlias
	 *            the alias of a key in the key storage view
	 * @param password
	 *            the password
	 * @param firmantes
	 *            the firmantes
	 * @return the string
	 * @throws Exception
	 *             the exception
	 */
	// public String enviarArchivo(String workingPath, String originFileName,
	// String destFileName, String encriptedFileName, String certificado,
	// String keyStorageView, String sAlias, String password,
	// String[] firmantes, EnviarArchivoEntity enviarArchivoEntity)
	// throws Exception {
	// /*
	// * BufferedOutputStream bis = new BufferedOutputStream( new
	// * FileOutputStream( new File(workingPath + originFileName)));
	// */
	// String data = enviarArchivoEntity.toString();/*
	// * bis.write(data.getBytes())
	// * ; bis.close();
	// */
	//
	// // String firmaArchivoSinEncriptar = RSABC.obtenerMD5(data);
	//
	// // String firmaArchivoEncriptada = RSABC.procesarStringPubCert(true,
	// null,
	// // keyStorageView, sAlias, password, firmaArchivoSinEncriptar);
	//
	// String compresed = Zipper.compress(data);
	//
	// // byte[] key = generateKey();
	// String encripted = encriptarArchivo(compresed);
	//
	// // Base64 b64 = new Base64();
	// // String claveB64 = b64.encode(key);
	// // String clave3DesEncriptada = RSABC.procesarStringPubCert(true, null,
	// // keyStorageView, sAlias, password, claveB64);
	//
	// // if (firmantes != null) {
	// // StringBuffer strFirmantes = new StringBuffer();
	// // for (String firmante : firmantes) {
	// // strFirmantes.append(firmante);
	// // }
	// // String firmantesEncriptada = RSABC.procesarStringPubCert(true,
	// // null, keyStorageView, sAlias, password,
	// // strFirmantes.toString());
	// // }
	// return encripted;
	// }

	public String enviarArchivo(EnviarArchivoEntity enviarArchivoEntity, String keyStorageView, String sAlias, String password) throws Exception {

		//String data = enviarArchivoEntity.toString();
		String encripted = RSABC.procesarStringPubCertPorPartes(true, keyStorageView, sAlias, password, enviarArchivoEntity.toString());
		return encripted;
		//return encriptarArchivo(data);
	}

	public String enviarArchivo(String data, String keyStorageView, String sAlias, String password) throws Exception {
		//String compresed = Zipper.compress(data);
		//String encripted = encriptarArchivo(compresed);
		String encripted = RSABC.procesarStringPubCertPorPartes(true, keyStorageView, sAlias, password, data);
		return encripted;
	}
	
	public String enviarArchivo(EnviarArchivoEntity enviarArchivoEntity, byte[] secretKey) throws Exception {
		String compresed = Zipper.compress(enviarArchivoEntity.toString());
		return encriptarArchivo(compresed, secretKey);
		//return RSABC.procesarStringPubCert(true, keyStorageView, sAlias, password, encripted);
	}
	
	public String enviarArchivo(String archivo, byte[] secretKey) throws Exception {
		String compresed = Zipper.compress(archivo);
		return encriptarArchivo(compresed, secretKey);
		//return RSABC.procesarStringPubCert(true, keyStorageView, sAlias, password, encripted);
	}

	/**
	 * Encriptar archivo.
	 * 
	 * @param workingPath
	 *            the working path
	 * @param originFileName
	 *            the origin file name
	 * @param destFileName
	 *            the dest file name
	 * @param encriptedFileName
	 *            the encripted file name
	 * @return the byte[]
	 */
	@SuppressWarnings("unused")
	private byte[] encriptarArchivo(String workingPath, String originFileName, String destFileName,
			String encriptedFileName) {
		byte[] key = new byte[24];
		Random r = new Random();
		r.nextBytes(key);
		SecretKey secKey = new SecretKeySpec(key, "DESede");
		TripleDES.encriptar(workingPath + destFileName, workingPath + encriptedFileName, secKey, true);
		return key;
	}

	/**
	 * Encriptar archivo.
	 * 
	 * @param input
	 *            the input
	 * @param secretKey
	 *            the secretKey
	 * @return the encripted string
	 */
	private String encriptarArchivo(String input, byte[] secretKey) throws Exception {
		//secretKey = new String(generateKey());
		SecretKey secKey = new SecretKeySpec(secretKey, "DESede");
		return TripleDES.encriptar(input, secKey, true);
	}

	/**
	 * Genera la key.
	 * 
	 * @param workingPath
	 *            the working path
	 * @param originFileName
	 *            the origin file name
	 * @param destFileName
	 *            the dest file name
	 * @param encriptedFileName
	 *            the encripted file name
	 * @return the byte[]
	 */
	public byte[] generateKey() {
		byte[] key = new byte[24];
		Random r = new Random();
		r.nextBytes(key);
		return key;
	}

}
